package com.universest.swordholder.model.textaction

import android.content.Context
import android.util.Log
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.FormatIndentDecrease
import androidx.compose.material.icons.filled.Build
import androidx.compose.material.icons.filled.Checklist
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.ContentCut
import androidx.compose.material.icons.filled.ContentPaste
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.SelectAll
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
import com.universest.swordholder.tools.passageFormat
import java.util.Scanner


/**
 * 文本操作数据类，用于封装一个文本编辑动作的相关信息。
 *
 * @property actionName 操作名称，例如“复制”、“粘贴”等。
 * @property icon 显示图标，通常用于界面展示。
 * @property enabled 判断当前操作是否可用的函数，默认始终启用。
 * @property executor 执行该操作的具体逻辑函数。
 */
data class TextAction(
    val actionName: String,
    val icon: ImageVector,
    val enabled: (TextFieldValue) -> Boolean = { true },
    val executor: (TextFieldValue) -> TextFieldValue?,
)

/**
 * 获取所有支持的文本操作列表。
 *
 * @param context 上下文对象，用于访问系统服务如剪贴板管理器。
 * @return 返回一组预定义的 [TextAction] 对象列表。
 */
fun getTextActionList(context: Context): List<TextAction> {
    return listOf(
        createTextAction(
            name = "复制",
            icon = Icons.Default.ContentCopy,
            enabled = { it.selection.length > 0 },
            executor = { actionCopy(context, it) }
        ),
        createTextAction(
            name = "删除",
            icon = Icons.Default.Delete,
            enabled = { it.selection.length > 0 },
            executor = { actionDelete(it) }
        ),
        createTextAction(
            name = "剪切",
            icon = Icons.Default.ContentCut,
            enabled = { it.selection.length > 0 },
            executor = { actionDelete(actionCopy(context,it)) }
        ),
        createTextAction(
            name = "缩进",
            icon = Icons.AutoMirrored.Filled.FormatIndentDecrease,
            enabled = { it.selection.start == it.selection.end },
            executor = { actionIndent(it) }
        ),
        createTextAction(
            name = "粘贴",
            icon = Icons.Default.ContentPaste,
            executor = { actionPaste(context,it) }
        ),
        createTextAction(
            name = "选段",
            icon = Icons.Default.Checklist,
            executor = { actionSelectParagraph(it)}
        ),
        createTextAction(
            name = "全选",
            icon = Icons.Default.SelectAll,
            executor = { actionSelectAll(it)}
        ),
        createTextAction(
            name = "清除",
            icon = Icons.Default.Clear,
            executor = { actionClear(it) }
        ),
        createTextAction(
            name = "格式化",
            icon = Icons.Default.Code, // 使用 Build 图标表示格式化操作
            executor = { actionFormat(it) } // 假设你已经实现了 actionFormat 方法
        )
    )
}

/**
 * 根据指定参数创建一个新的 [TextAction] 实例。
 *
 * @param name 操作名称。
 * @param icon 图标资源。
 * @param enabled 控制按钮是否可点击的条件，默认始终启用。
 * @param executor 执行此操作时调用的方法。
 * @return 新建的 [TextAction] 实例。
 */
private fun createTextAction(
    name: String,
    icon: ImageVector,
    enabled: (TextFieldValue) -> Boolean = { true},
    executor: (TextFieldValue) -> TextFieldValue
): TextAction {
    return TextAction(name, icon, enabled, executor)
}

/**
 * 将光标所在段落进行选中。即从上一个换行符到下一个换行符之间的内容。
 *
 * @param textFieldValue 当前输入框的状态。
 * @return 更新后的 TextFieldValue，其中 selection 被设置为整段范围。
 */
private fun actionSelectParagraph(textFieldValue: TextFieldValue): TextFieldValue {
    val text = textFieldValue.text
    val cursorPosition = textFieldValue.selection.start

    // 找到上一个换行符的位置，默认为-1（表示文本开始）
    val lastNewLineIndex = text.lastIndexOf('\n', cursorPosition - 1)
    val start = lastNewLineIndex + 1

    // 找到下一个换行符的位置，默认为文本长度（表示文本结束）
    val nextNewLineIndex = text.indexOf('\n', cursorPosition)
    val end = if (nextNewLineIndex == -1) text.length else nextNewLineIndex

    // 创建新的选择范围
    val newSelection = TextRange(start, end)

    return textFieldValue.copy(selection = newSelection)
}

/**
 * 全选整个文本内容。
 *
 * @param textFieldValue 当前输入框状态。
 * @return 更新后的 TextFieldValue，其 selection 包含全部文本。
 */
private fun actionSelectAll(textFieldValue: TextFieldValue): TextFieldValue{
    return textFieldValue.copy(text = textFieldValue.text, selection = TextRange(0, textFieldValue.text.length))
}

/**
 * 在当前光标所在的行首插入两个空格以实现简单缩进功能。
 *
 * @param textFieldValue 当前输入框状态。
 * @return 插入空格后的新 TextFieldValue。
 */
private fun actionIndent(textFieldValue: TextFieldValue): TextFieldValue {
    val text = textFieldValue.text
    val selectionStart = textFieldValue.selection.start

    // 找到selectionStart之前的最后一个换行符位置
    val lastNewLineIndex = text.lastIndexOf('\n', selectionStart - 1)
    // 在换行符后插入缩进
    val indent = "　　"
    val newText = buildString {
        append(text.substring(0, lastNewLineIndex + 1))
        append(indent) // 添加缩进
        append(text.substring(lastNewLineIndex + 1))
    }

    // 保持光标在原来文本的位置
    val newSelection = TextRange(selectionStart + indent.length)

    return textFieldValue.copy(text = newText, selection = newSelection)
}

/**
 * 复制选中的文本到剪贴板。
 *
 * @param context 应用上下文，用于获取剪贴板服务。
 * @param textFieldValue 当前输入框状态。
 * @return 原始 TextFieldValue 不变。
 */
private fun actionCopy(context: Context, textFieldValue: TextFieldValue): TextFieldValue {
    val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager
        ?: run {
            Log.e("TextAction", "Clipboard service is not available.")
            return textFieldValue
        }
    val selection = textFieldValue.selection
    val clipData = android.content.ClipData.newPlainText("Copied Text", textFieldValue.text.substring(selection.start, selection.end))
    clipboardManager.setPrimaryClip(clipData)
    return textFieldValue
}

/**
 * 删除选中文本，并将光标移动至删除区域起点。
 *
 * @param textFieldValue 当前输入框状态。
 * @return 删除完成后的 TextFieldValue。
 */
private fun actionDelete(textFieldValue: TextFieldValue): TextFieldValue {
    val selection = textFieldValue.selection
    if (selection.collapsed) return textFieldValue

    val start = selection.min
    val end = selection.max
    val originalText = textFieldValue.text

    val newText = buildString {
        append(originalText.substring(0, start))
        append(originalText.substring(end))
    }

    // 光标停留在删除起始位置
    val newSelection = TextRange(start)
    return textFieldValue.copy(text = newText, selection = newSelection)
}

/**
 * 清除整个输入框的内容并重置光标位置。
 *
 * @param textFieldValue 当前输入框状态。
 * @return 内容为空、光标位于开头的新 TextFieldValue。
 */
private fun actionClear(textFieldValue: TextFieldValue): TextFieldValue{
    val newText = ""
    val newSelection = TextRange(0)
    return TextFieldValue(newText, newSelection)
}

/**
 * 从剪贴板读取内容并插入到当前位置或替换选区内容。
 *
 * @param context 应用上下文，用于获取剪贴板服务。
 * @param textFieldValue 当前输入框状态。
 * @return 粘贴完成后更新的 TextFieldValue。
 */
private fun actionPaste(context:Context,textFieldValue: TextFieldValue): TextFieldValue {
    try {
        val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as? android.content.ClipboardManager
            ?: run {
                Log.e("TextAction", "Clipboard service is not available.")
                return textFieldValue
            }

        val clipData = clipboardManager.primaryClip
        if (clipData != null && clipData.itemCount > 0) {
            val pasteText = clipData.getItemAt(0).coerceToText(context).toString()

            val selection = textFieldValue.selection
            val start = selection.min
            val end = selection.max
            val originalText = textFieldValue.text

            val newText = buildString {
                append(originalText.substring(0, start))
                append(pasteText)
                append(originalText.substring(end))
            }

            // 将光标定位到粘贴文本的末尾
            val newCursorPosition = start + pasteText.length
            val newSelection = TextRange(newCursorPosition)

            return textFieldValue.copy(text = newText, selection = newSelection)
        }
    } catch (throwable: Throwable) {
        Log.e("TextAction", throwable.message ?: "")
    }
    return textFieldValue
}


private fun actionFormat(textFieldValue: TextFieldValue): TextFieldValue {
    return textFieldValue.copy(text = textFieldValue.text.passageFormat(), selection = TextRange(0))
}